<?php

class SetorController extends Controller {

    /**
     * @final   pacote das views deste controller
     */
    const PACKAGE_VIEW = 'setor';

    /**
     * @var SetorService
     */
    private $setorService;
    /**
     * @var DepartamentoService
     */
    private $departamentoService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por PerfilController
     */
    public function __construct() {
        $this->setorService = SetorService::getInstance();
        $this->departamentoService = DepartamentoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
    }

    /**
     * @method  listarSetores
     *
     * Realiza a listagem de setores carregados por uma lista de funcionarios que pertencem
     * a estes setores.
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function listarSetores() {
        $ArSetores = $this->setorService->findAll();
        $this->save(SESSION_INTERFACE, 'SectorList', $ArSetores);
        $this->view('listar_setores', self::PACKAGE_VIEW);
    }
    /**
     * @method  cadastrarSetor
     *
     * Chama a view de cadastro de Setores, retornando uma lista de departamentos
     * para o setor ser atrelado
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function cadastrarSetor() {
        $ArDepartaments = $this->departamentoService->findAll(true);

        $this->save(SESSION_INTERFACE, 'DepartamentList', $ArDepartaments);

        $this->view('cadastrar', self::PACKAGE_VIEW);
    }
    /**
     * @method  inserir
     *
     * Cria um novo setor no banco de dados.
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function inserir() {
        $ArDados = $_POST;
        $Form = Validator::inserirSetor($ArDados);

        if( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            if ($this->setorService->save($ArDados)) {
                $this->saveReturn('Setor criado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao criar Setor.');
            }
        }
        $this->showJsonResponse();
    }
    /**
     * @method  editarSetor
     *
     * Chama a view de editar perfil carregando o Setor a ser editado, junto com
     * a lista de departamentos possiveis para o setor ser trocado
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function editarSetor() {
        $IDSetor = treatUrl('id');
        multipleEntities($IDSetor);
        $ArDepartaments = $this->departamentoService->findAll(true);
        $Sector = $this->setorService->findById($IDSetor);

        $this->save(SESSION_INTERFACE, 'SectorEdit', $Sector);
        $this->save(SESSION_INTERFACE, 'DepartamentList', $ArDepartaments);

        $this->view('editar', self::PACKAGE_VIEW);
    }
    /**
     * @method  atualizar
     *
     * Realiza a acao de atualiza os dados do setor
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function atualizar() {
        $ArDados = $_POST;
        $Form = Validator::inserirSetor($ArDados);

        if( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            if ($this->setorService->update($ArDados)) {
                $this->saveReturn('Setor atualizado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao atualizado Setor.');
            }
        }
        $this->showJsonResponse();
    }
    /**
     * @method  excluirSetor
     *
     * Chama a view de deletar setor. Carrega o Setor a ser excluido alem de
     * carregar todos os funcionarios desse setor e a lista dos outros setores
     * para que os funcionarios que estejam nesse setor sejam transferidos ou
     * demitidos.
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function excluirSetor() {
        $IDSetor = treatUrl('id');
        multipleEntities($IDSetor);
        $ArEmployees = $this->usuarioService->findBySector($IDSetor);
        $ArSector = $this->setorService->findAll();
        $Sector = $this->setorService->findById($IDSetor);

        $this->save(SESSION_INTERFACE, 'UserList', $ArEmployees);
        $this->save(SESSION_INTERFACE, 'SectorList', $ArSector);
        $this->save(SESSION_INTERFACE, 'SectorEdit', $Sector);

        $this->view('delete', self::PACKAGE_VIEW);
    }
    /**
     * @method  delete
     *
     * Realiza a acao de deletar setor e transferir ou demiti os funcionarios do setor
     * deletado.
     *
     * @since   Abril de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function delete() {
        multipleEntities($_POST);
        $ArDismiss = !empty($_POST['Dismiss']) ? explode(', ', $_POST['Dismiss']) : false ;
        $ArIdUsersToChangeSector = !empty($_POST['Usuario']) ? $_POST['Usuario'] : false ;
        $IDDeletedSetor = $_POST['IDSetor'];

        if( !empty($ArDismiss) && !$this->usuarioService->dismissService($ArDismiss) ) {
            $this->saveReturn('Ocorreu um erro ao demitir um ou mais funcionários.');
        }
        if( !empty($ArIdUsersToChangeSector) && !$this->hasReturn() && !$this->usuarioService->changeSector($ArIdUsersToChangeSector) ) {
            $this->saveReturn('Ocorreu um erro ao trocar um ou mais usuários de setor.');
        }
        if( !$this->hasReturn() && $this->setorService->delete($IDDeletedSetor) ) {
            $this->saveReturn('Setor excluído com sucesso! Aguarde e voc&ecirc; ser&aacute; redirecionado.', 1);
        } else {
            $this->saveReturn('Ocorreu um erro ao excluir o setor.');
        }

        $this->showJsonResponse();
    }

    public function visualizarSetor() {
        $IDSetor = treatUrl('id');
        multipleEntities($IDSetor);
        $Setor = $this->setorService->findSimpleById($IDSetor);
        if (empty($Setor)) {
            return redirect('setor', 'listar-setores');
        }
        $this->save(SESSION_INTERFACE, 'Sector', $Setor);
        $this->view('visualizar_setor', self::PACKAGE_VIEW);
    }

}

?>
